/********************************************************************************
 * Project Name		[JavaEE_Web]
 * File Name     	[JSP09.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package _notes.jsp;

/**
 * 一些JSP的面试题
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public class JSP09 {

	public void question1() {
		/**
		 * <jsp:include/>和<%@include%>的区别<br/>
		 * 
		 * 1. 引入内容的不同<br/>
		 * <jsp:include>:<br/>
		 * a. 动态引入, 引入的是被引入页面的输出内容, 被引入页面先编译后引入<br/>
		 * b. 被引入的内容与当前页面独立, 其是一个能独立被Web容器调用和执行的资源<br/>
		 * c. 被引入的页面生成多个Servlet源文件<br/>
		 * d. 在请求处理阶段执行, 不影响两个页面的编译<br/>
		 * e. 可以使用 <jsp:param>子标签传参数<br/>
		 * f. 底层实现<br/>
		 * <code>
		 * org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "被包含的页面", out, false);//通过该方法把目标页面包含进来
		 * </code><br/>
		 * 
		 * <%@include%>:<br/>
		 * a. 静态引入, 引入的是被引入页面的原始内容, 被引入页面先引入后编译<br/>
		 * b. Web容器不会检查所包含页面的变化, 适用于引入静态页面<br/>
		 * c. 被引入页面和引入页面共享所有的变量[不能定义重名变量], 指令[除pageEncoding和import外]<br/>
		 * d. 生成一个Servlet源文件<br/>
		 * e. 在翻译阶段执行<br/>
		 */
	}

	public void question2() {
		/**
		 * RequestDispatcher.forward()方法, PageContext.forward()方法和
		 * <jsp:forward/>标签的区别<br/>
		 * 
		 * 1. 调用RequestDispatcher.forward方法的JSP脚本代码的前后不能有JSP模版内容<br/>
		 * 2. 调用PageContext.forward方法的JSP脚本代码的后面不能有JSP模版内容<br/>
		 * 3. <jsp:forward/>标签的前后都能有JSP模版内容, 可以使用
		 * <jsp:param name="paramName" value="paramValue|<%=expression%>">
		 * 子标签传参数, 在跳转后的页面可以通过request.getParameter("paramName")得到传递参数值<br/>
		 */
	}

	public void question3() {
		/**
		 * .jspf扩展名文件在<jsp:include>, <%@ include%>和<c:import>中的区别<br/>
		 * 
		 * 1. 只有用<% @include%>指令时jspf文件的内容才会被解析并执行其中的JSP内容<br/>
		 * 2. <jsp:include>和<c:import>都会将其当作纯文本文件处理<br/>
		 * 在web.xml中添加对扩展名为.jspf文件的映射[Tomcat 8中已经添加支持]<br/>
		 * <code>
		 * <servlet-mapping>
		 *     <servlet-name>jsp</servlet-name>
		 *     <url-pattern>*.jsp</url-pattern>
		 *     <url-pattern>*.jspx</url-pattern>
		 * </servlet-mapping>
		 * </code>
		 */
	}

	public void question4() {
		/**
		 * Web开发的两种模式<br/>
		 * 
		 * 1. JSP + JavaBean<br/>
		 * JSP负责处理用户请求, 显示数据, 以及业务对象[JavaBean]的调用<br/>
		 * JavaBean用于封装业务数据<br/>
		 * 
		 * 2. JSP + Servlet + JavaBean[MVC] @see {@linkplain MVC#mvc() MVC}<br/>
		 * 
		 * JavaBean作为模型的缺点<br/>
		 * JavaBean组件类既负责收集封装数据, 又要进行业务逻辑处理,这样可能造成JavaBean组件类很庞大<br/>
		 * 多采用三层架构实现JavaBean的功能domain-dao-service<br/>
		 * 
		 * JSP作为视图的缺点<br/>
		 * 视图被绑定到JSP, 难以更换<br/>
		 *
		 * Servlet作为控制器的缺点<br/>
		 * 1. 逻辑可能较为复杂, 比如需要动态方法调用<br/>
		 * 2. 请求参数封装较为麻烦<br/>
		 * 3. 依赖ServletAPI, 比如请求转发, 比如传递要显示的数据<br/>
		 */
	}
}
